#include "ota_version.h"
#include "ota_http_curl.h"
#include <unistd.h>
#include "log.h"
// #include "app_common.h"
#include <cJSON.h>
#include <openssl/sha.h>
// #include <sys/reboot.h>
#include <stdlib.h>
#include <string.h>

char* calculate_file_sha1(const char* filepath) {
    FILE* file = fopen(filepath, "rb");
    if (!file) {
        perror("Failed to open file");
        return NULL;
    }

    unsigned char buffer[4096];
    unsigned char digest[SHA_DIGEST_LENGTH];
    SHA_CTX sha_ctx;

    SHA1_Init(&sha_ctx);

    size_t bytes_read;
    while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) != 0) {
        SHA1_Update(&sha_ctx, buffer, bytes_read);
    }

    SHA1_Final(digest, &sha_ctx);

    fclose(file);

    char* sha1_string = (char*)malloc(SHA_DIGEST_LENGTH * 2 + 1);
    if (!sha1_string) {
        perror("Failed to allocate memory for SHA1 string");
        return NULL;
    }

    for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
        sprintf(&sha1_string[i * 2], "%02x", digest[i]);
    }

    return sha1_string;
}

int ota_check_update(void)
{
    // 利用curl获取ota版本信息（版本号，sha1验证码）
    response_body_t *response_body = ota_http_curl_get_response(OTA_URL);
    if (response_body == NULL)
    {
        log_error("获取远端文件信息失败");
        return -1;
    }
    char * fileinfo_json = response_body->data;
    // 利用cjson提取版本json信息的内容（版本号，sha1验证码）
    cJSON *root = cJSON_Parse(fileinfo_json);
    if (root == NULL)
    {
        log_error("解析json信息失败");
        return -1;
    }
    cJSON *version_major_json = cJSON_GetObjectItem(root, "major");
    cJSON *version_minor_json = cJSON_GetObjectItem(root, "minor");
    cJSON *version_patch_json = cJSON_GetObjectItem(root, "patch");
    cJSON *ots_sha_json = cJSON_GetObjectItem(root, "sha1");

    int version_major = version_major_json->valueint;
    int version_minor = version_minor_json->valueint;
    int version_patch = version_patch_json->valueint;
    char *ots_sha = ots_sha_json->valuestring;

    // 比较版本号 用当前程序的版本号和远程版本号进行比较
    if (version_major < VERSION_MAJOR  
        || version_major == VERSION_MAJOR && version_minor < VERSION_MINOR
        || version_major == VERSION_MAJOR && version_minor == VERSION_MINOR && version_patch <= VERSION_PATCH)
    {
        log_info("未发现新版本");
        return 0;
    }
    log_info("发现新版本 %d.%d.%d",version_major,version_minor,version_patch);
    unlink(OTA_LOCAL_FILE_PATH);
    // 如果本地版本好低，则进行下载 利用curl来下载文件
    if (ota_http_curl_download(OTA_URL_DOWNLOAD,OTA_LOCAL_FILE_PATH))
    {
        log_error("下载文件失败");
        return -1;
    }
    sleep(2);
    // 生成本地文件的sha1验证码 (ai)
    char * sha1 = calculate_file_sha1(OTA_LOCAL_FILE_PATH);
    // 把本地生成的sha1验证码和远程的sha1验证码进行比较
    if (strcmp(sha1,ots_sha) == 0)
    {
        // 如果本地的sha1验证码和远程的sha1验证码一致，则下载成功，否则返回 0
        free(response_body);
        cJSON_Delete(root);
        return 0;
    }
    else
    {
        // 如果本地的sha1验证码和远程的sha1验证码不000一致，则下载的文件删除 返回 -1
        free(response_body);
        cJSON_Delete(root);
        unlink(OTA_LOCAL_FILE_PATH);
        return -1;
    }
    // 重启整个系统
    
}

void ota_check_update_daily(void)
{
    while (1)
    {
        sleep(24 * 60 * 60);
        ota_check_update();
    }
}

void ota_show_version(void)
{
    printf("version: %d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
}
